package co.edu.udea.gwt.client;

import java.util.List;

import co.edu.udea.gwt.client.modelgwt.DispositivosGWT;
import co.edu.udea.gwt.client.modelgwt.Generales;
import co.edu.udea.gwt.client.modelgwt.SolicitudGWT;
import co.edu.udea.gwt.client.modelgwt.UsuariosGWT;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

import exceptions.ExecptionRTF;

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class RTFGWT implements EntryPoint {

	private VerticalPanel mPanel = new VerticalPanel();
	private HorizontalPanel hPanel = new HorizontalPanel();
	private FlexTable tabla = new FlexTable();
	private FlexTable tabla1 = new FlexTable();
	private TextBox tbNombre = new TextBox();
	private TextBox tbDocumento = new TextBox();
	private TextBox tbTelefono = new TextBox();
	private TextBox tbCelular = new TextBox();
	private TextBox tbCorreo = new TextBox();
	private TextBox tbConfimacion = new TextBox();
	private ListBox lbSucursal = new ListBox();
	private ListBox lbProducto = new ListBox();
	private ListBox lbTipoSolicitud = new ListBox();
	private Label mensaje = new Label("los datos marcados con \"*\" son obligatorios.");
	private Button bGuardar = new Button("Guardar");
	private Button bConsulta = new Button("Consultar");
	private Button bCancelar = new Button("Cancelar");
	// private List<Solicitud> solicitudes = new ArrayList<Solicitud>();

	final TabPanel tabPanel = new TabPanel();
	private VerticalPanel mPanel2 = new VerticalPanel();
	private HorizontalPanel hPanel2 = new HorizontalPanel();
	private TextBox tbNombre2 = new TextBox();
	private TextBox tbDocumento2 = new TextBox();
	private TextBox tbTelefono2 = new TextBox();
	private TextBox tbCorreo2 = new TextBox();
	private Button bConsulta2 = new Button("Consultar");
	private FlexTable solicitudesTable = new FlexTable();
	
	/**
	 * Entry point
	 */
	@Override
	public void onModuleLoad() {
		
		tabla.setText(0, 0, "Documento *");
		tabla.setText(1, 0, "Nombres *");
		tabla.setText(2, 0, "Telefono *");
		tabla.setText(3, 0, "Correo Electronico *");
		tabla.setText(4, 0, "Dispositivo solicitado *");
		tabla.setWidget(0, 1, tbDocumento);
		tabla.setWidget(0, 2, bConsulta);
		tabla.setWidget(1, 1, tbNombre);
		tabla.setWidget(2, 1, tbTelefono);
		tabla.setWidget(3, 1, tbCorreo);
		tabla.setWidget(4, 1, lbProducto);
		tabla.setWidget(5, 1, bGuardar);
		tabla.setWidget(6, 1, bCancelar);
		
		tabla1.setText(0, 0, "Documento *");
		tabla1.setText(1, 0, "Nombres *");
		tabla1.setText(2, 0, "Telefono *");
		tabla1.setText(3, 0, "Correo Electronico *");
		tabla1.setWidget(0, 1, tbDocumento2);
		tabla1.setWidget(0, 2, bConsulta2);
		tabla1.setWidget(1, 1, tbNombre2);
		tabla1.setWidget(2, 1, tbTelefono2);
		tabla1.setWidget(3, 1, tbCorreo2);

		
		tbNombre.setEnabled(false);
		tbTelefono.setEnabled(false);
		tbCorreo.setEnabled(false);
		
		tbNombre2.setEnabled(false);
		tbTelefono2.setEnabled(false);
		tbCorreo2.setEnabled(false);
	

		hPanel.setSpacing(5);
		hPanel2.setSpacing(5);

		mPanel.add(tabla);
		mPanel.add(hPanel);
		mPanel2.add(tabla1);
		mPanel2.add(hPanel2);
		
		 tabPanel.setWidth("1000");
		 
		tabPanel.add(mPanel, "Nueva Solicitud");
		tabPanel.add(mPanel2, "Consulta de Solicitudes");
		
		//RootPanel.get("contenedor").add(mPanel);
		tbDocumento.setFocus(true);

		tabPanel.addSelectionHandler(new SelectionHandler<Integer>() {
	         @Override
	         public void onSelection(SelectionEvent<Integer> event) {
	            /* add a token to history containing pageIndex 
	             History class will change the URL of application
	             by appending the token to it.
	            */
	            History.newItem("pageIndex" + event.getSelectedItem());				
	         }
		 });
		
		History.addValueChangeHandler(new ValueChangeHandler<String>() {
	         @Override
	         public void onValueChange(ValueChangeEvent<String> event) {
	            String historyToken = event.getValue();
	            /* parse the history token */
	            try {
	               if (historyToken.substring(0, 9).equals("pageIndex")) {
	                  String tabIndexToken = historyToken.substring(9, 10);
	                  int tabIndex = Integer.parseInt(tabIndexToken);
	                  /* select the specified tab panel */
	                  tabPanel.selectTab(tabIndex);
	               } else {
	                  tabPanel.selectTab(0);
	               }
	            } catch (IndexOutOfBoundsException e) {
	               tabPanel.selectTab(0);
	            }
	         }
	      });
		
		 tabPanel.selectTab(0);
		 RootPanel.get("contenedor").add(tabPanel);
		
		bCancelar.addClickHandler(new ClickHandler() {

			@Override
			public void onClick(ClickEvent event) {
				cancelar();
			}
		});
		
		bGuardar.addClickHandler(new ClickHandler() {

			@Override
			public void onClick(ClickEvent event) {
				if(tbDocumento.getText().length() > 0 && tbNombre.getText().length() > 0 && tbTelefono.getText().length() > 0 && tbCorreo.getText().length() > 0) {
					guardar(getForm());
				}else {
					Window.alert("La informacion de la persona debe estar completa");	
					return;
				}
			}
		});
		
		
		bConsulta.addClickHandler(new ClickHandler() {

			@Override
			public void onClick(ClickEvent event) {
				
				if(validarDocument(tbDocumento.getText())) {
					consultar(tbDocumento.getText());
				}
				else {
					Window.alert("Debe ingresar un documento valido");	
					return;
				}
			}
		});
		
		bConsulta2.addClickHandler(new ClickHandler() {

			@Override
			public void onClick(ClickEvent event) {
				if(validarDocument(tbDocumento2.getText())) {
					solicitudesTable.removeAllRows();
					mPanel2.remove(solicitudesTable);
					consultar2(tbDocumento2.getText());		
				}
				else {
					Window.alert("Debe ingresar un documento valido");	
					return;
				}
				
			}
		});
		
		
		
		
		
		
		ServiciosGeneralesRemotos.Util.getInstance().traerObjetos(new AsyncCallback<Generales>() {

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Error al cargar dispositivos"+ caught.getMessage());			
			}

			@Override
			public void onSuccess(Generales result) {
				if(result == null)
				{
					Window.alert("Hubo un error al cargar los dispositivos");
					return;
				}
				cargarProductos(result.getProductosGWTs());
			}

		});
	}



	protected void cargarProductos(List<DispositivosGWT> productosGWTs) {
		
		for(DispositivosGWT producto : productosGWTs) {
			lbProducto.addItem(producto.getNombre(), producto.getCodigoDispositivo() + "");
		}	
	}
	
	protected void consultar(String documento) {
		ServiciosGeneralesRemotos.Util.getInstance().consultarUsuario(documento, new AsyncCallback<Generales>() {
			
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Error al consultar documento"+ caught.getMessage());			
			}


			@Override
			public void onSuccess(Generales result) {
				if(result == null)
				{
					Window.alert("El investigador con documento: "+ tbDocumento.getText() +" no se encuentra registrado");
					return;
				} else {
					cargarUsuario(result.getUsuariosGWTs());
				}
				
			}

		});
	}
	
	protected void consultar2(String documento) {
		//TODO validacion de campos
		ServiciosGeneralesRemotos.Util.getInstance().consultarUsuario(documento, new AsyncCallback<Generales>() {
			
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Error al consultar documento"+ caught.getMessage());			
			}


			@Override
			public void onSuccess(Generales result) {
				if(result == null)
				{
					Window.alert("El investigador con documento: "+ tbDocumento2.getText() +" no se encuentra registrado");
					return;
				} else {
					cargarUsuario2(result.getUsuariosGWTs());
				}
				
			}

		});
	}
	

	protected void guardar(SolicitudGWT solicitudGWT) {
		//TODO validacion de campos
		ServiciosGeneralesRemotos.Util.getInstance().guardarSolicitud(solicitudGWT, new AsyncCallback<Boolean>() {
			
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("No se pudieron almacenar los datos");			
			}

			@Override
			public void onSuccess(Boolean result) {
				if(result == false)
				{
					Window.alert("Hubo un error al traer los datos");
					return;
				} else {
					Window.alert("Se almaceno la solicitud correctamente");
					cancelar();
					return;
				}

			}

		});
	}
	
	protected void consultarSolicitudes(String documento) {
		//TODO validacion de campos
		ServiciosGeneralesRemotos.Util.getInstance().consultarSolicitudes(documento, new AsyncCallback<Generales>() {
			
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("No se pudieron consultar las solicitudes");			
			}


			@Override
			public void onSuccess(Generales result) {
				if(result == null)
				{
					Window.alert("Hubo un error al traer los datos");
					return;
				} else {
					cargarSolicitudes(result.getSolicitudesGWTs());
				}
			}

		});
	}
	
	
	protected void cargarSolicitudes(List<SolicitudGWT> listaSolicitudesGWT) {
	
		int fila = 1;	
		solicitudesTable.setBorderWidth(1);
		solicitudesTable.setTitle("Solicitudes");
		solicitudesTable.setCellSpacing(10);
		solicitudesTable.setText(0, 0, "Codigo Solicitud");
		solicitudesTable.setText(0, 1, "Estado Solicitud");
		solicitudesTable.setText(0, 2, "Nombre Dispositivo");
		solicitudesTable.setText(0, 3, "Estado Dispositivo");
		solicitudesTable.setText(0, 4, "Fecha Solicitud");
		solicitudesTable.setText(0, 5, "Fecha Prestamo");
		solicitudesTable.setText(0, 6, "Fecha Fin Prestamo");
		for(SolicitudGWT solicitudGWT : listaSolicitudesGWT) {
			solicitudesTable.setText(fila, 0, Integer.toString(solicitudGWT.getCodigoSolicitud()));
			solicitudesTable.setText(fila, 1, solicitudGWT.getEstadoSolicitud());
			solicitudesTable.setText(fila, 2, solicitudGWT.getDispositivo().getNombre());
			solicitudesTable.setText(fila, 3, solicitudGWT.getDispositivo().getEstadoDispositivo());
			solicitudesTable.setText(fila, 4, solicitudGWT.getFechaSolicitud().toString());
			if(solicitudGWT.getHoraInicioPrestamo() != null) {
				solicitudesTable.setText(fila, 5, solicitudGWT.getHoraInicioPrestamo().toString());
				solicitudesTable.setText(fila, 6, solicitudGWT.getHoraFinPrestamo().toString());
			}else {
				solicitudesTable.setText(fila, 5, "");
				solicitudesTable.setText(fila, 6, "");
			}
			fila++;
		}
		
		mPanel2.add(solicitudesTable);
	}
	
	protected void cargarUsuario2(UsuariosGWT user) {
		tbNombre2.setText(user.getNombreUsuario());
		tbCorreo2.setText(user.getCorreoUsuario());
		tbTelefono2.setText(user.getTelefonoUsuario());
		consultarSolicitudes(tbDocumento2.getText());

	}
	
	protected void cargarUsuario(UsuariosGWT user) {
		tbNombre.setText(user.getNombreUsuario());
		tbCorreo.setText(user.getCorreoUsuario());
		tbTelefono.setText(user.getTelefonoUsuario());
	}
	
	
	protected boolean validarDocument(String documento) {
		try{
			Integer.parseInt(documento);
			return true;
		} catch (Exception e) {
			return false;
		}
		
	}

	protected SolicitudGWT getForm() {
		SolicitudGWT solicitudGWT = new SolicitudGWT();
		DispositivosGWT dispositivoGWT = new DispositivosGWT();
		UsuariosGWT userGWT = new UsuariosGWT();
		userGWT.setNombreUsuario(tbNombre.getText());
		userGWT.setIdentificacionUsuario(tbDocumento.getText());
		userGWT.setCorreoUsuario(tbCorreo.getText());				
		userGWT.setTelefonoUsuario(tbTelefono.getText());
		solicitudGWT.setUsuario(userGWT);
		String codProd = lbProducto.getValue(lbProducto.getSelectedIndex());
		dispositivoGWT.setcodigoDispositivo(codProd);
		solicitudGWT.setDispositivo(dispositivoGWT);
		return solicitudGWT;
	}
	
	protected void cancelar() {
		tbNombre.setText("");
		tbDocumento.setText("");
		tbTelefono.setText("");
		tbCelular.setText("");
		tbCorreo.setText("");
		tbConfimacion.setText("");
	}
}
